Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

DbSimple v2.x: лаконичная работа с различными СУБД (Дмитрий Котеров, оценка: 10)
Goto page Previous  1, 2, 3 ... 7, 8, 9 ... 13, 14, 15  Next
Author Message
володя смотеско
Заглянувший



Joined: 28 Mar 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Fri Mar 28, 2008 6:58 pm (написано за 3 минуты 41 секунду)
   Post subject:
Reply with quote

у меня некорректно работает SELECT FOUND_ROWS()
делаю такой запрос:
Code (php): скопировать код в буфер обмена
$db->selectPage($count,
"{SELECT * FROM ?# WHERE 1=1 {AND status = ?d } {AND op_id = ?d } {AND trade_point = ?d } {AND timest > ? AND timest < ? } {AND sum >= ?d } {AND sum <= ?d } LIMIT ?d, ?d}",
(empty (www.php.net/empty)($_GET['what'])? DBSIMPLE_SKIP : $_GET['what']),
((@$_POST['status']=="")? DBSIMPLE_SKIP : $_POST['status']),
(empty (www.php.net/empty)($_POST['operator'])? DBSIMPLE_SKIP : $_POST['operator']),
(empty (www.php.net/empty)($_POST['point'])? DBSIMPLE_SKIP : $_POST['point']),
(empty (www.php.net/empty)($_POST['startYear'])? DBSIMPLE_SKIP : $starttime), (empty (www.php.net/empty)($_POST['startYear'])? DBSIMPLE_SKIP : $endtime),
(empty (www.php.net/empty)($_POST['amount_min'])? DBSIMPLE_SKIP : $_POST['amount_min']),
(empty (www.php.net/empty)($_POST['amount_max'])? DBSIMPLE_SKIP : $_POST['amount_max']),
(empty (www.php.net/empty)($_POST['skip'])? 0 : $_POST['skip']+1),
(empty (www.php.net/empty)($_POST['rowsPerPage'])? $rowsPerPage : $_POST['rowsPerPage'])
);
если не передаю в POST-запросе 'skip' и 'rowsPerPage', а $rowsPerPage == 10, то выводится 10 записей и переменная $count тоже содержит десятку, хотя записей в таблице точно больше. в документации написано что selectPage() может не работать с UNION-запросами, но у меня юниона нет.
Back to top
View user's profile Send private message
mlitkin
Заглянувший



Joined: 28 Mar 2008
Posts: 3
Карма: 0
   поощрить/наказать


PostPosted: Mon Mar 31, 2008 1:37 am (спустя 2 дня 6 часов 38 минут; написано за 2 минуты 28 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Code (SQL): скопировать код в буфер обмена
SELECT FROM SYS_GET_SYNC_TABLE_COLUMNS(1)
DbSimple тут причем?
SQL приведенного вами вида работать в mysql 5 не будет. Там ХП вызываются через call.
А DbSimple тут как раз причем, т.к. он основан на mysql_ (а не на mysqli_) процедурах, в которых вызов ХП не поддерживается :(
forums.mysql.com/read.php?98,39264,39267#msg-39267
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 37
   поощрить/наказать

Location: Киев

PostPosted: Mon Mar 31, 2008 10:05 am (спустя 8 часов 27 минут; написано за 1 минуту 47 секунд)
   Post subject:
Reply with quote

mlitkin
Вы правы, я перепутал ХП и ХФ.
Quote:
DbSimple ... основан на mysql_ (а не на mysqli_) процедурах, в которых вызов ХП не поддерживается
Вот и первый повод включить mysqli в DbSimple.
Back to top
View user's profile Send private message Send e-mail
Paul_%
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Mar 31, 2008 6:37 pm (спустя 8 часов 31 минуту; написано за 2 минуты 54 секунды)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Вот и первый повод включить mysqli в DbSimple.
Нет, это очередной повод прикрутить PDO.

Когда ж наконец этот PHP4 похоронят?
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Tue Apr 01, 2008 1:46 am (спустя 7 часов 9 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

М-да... Без ХП то плохо :( Теряется значительная часть функциональности БД.
Back to top
sparton
Заглянувший



Joined: 07 Apr 2008
Posts: 1
Карма: 0
   поощрить/наказать


PostPosted: Mon Apr 07, 2008 4:32 pm (спустя 6 дней 14 часов 45 минут; написано за 6 минут 45 секунд)
   Post subject:
Reply with quote

А есть ли возможность при помощи данной библиотеки вынимать многомерный массив следующего плана,
Code (php): скопировать код в буфер обмена
$items = array (www.php.net/array)(
        "id" => 1,
        "name" => " 1",
        "characteristics" => array (www.php.net/array)(
                "height" => 30,
                "width" => 40,
                "weight" => 3
        )
        "madeby" => array (www.php.net/array)(
                "1" => "China",
                "2" => "Russia"
        )
       
)
Вообщем выборка товаров из БД с его возможными параметрами.

Сам товары в одной таблице, список параметров в другой, и таблица связей параметр - товар.
Буду благодарен за ответ!
Back to top
View user's profile Send private message
mmm_corp
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Apr 14, 2008 2:17 am (спустя 6 дней 9 часов 45 минут; написано за 28 секунд)
   Post subject:
Reply with quote

Неподдержка ХП привело к тому что пришлось переходить на другие варыанти, очень жаль(
Back to top
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Thu Apr 24, 2008 11:38 pm (спустя 10 дней 21 час 20 минут; написано за 14 минут 12 секунд)
   Post subject:
Reply with quote

Антон Макаренко wrote:
Юрик
Quote:
1. Как в первой строчке может возникнуть ошибка, если запрос корректен?
В приведенном Вами коде в условии if (!@$DB->query... проверяется, возвращает ли пустое значение вызовом этого метода, ни более того. В данном случае UPDATE возвращает количество измененных строк. Ноль измененных строк не означает наличие ошибки.
Да, я знаю. Проблема в том, что даже если есть строки, которые надо изменить, они НЕ будут изменены, если вставляемые в UPDATE данные идентичны тем, что были до этого.
Сам вопрос был поднят, т.к. в мануале к DbSimple был именно такой пример...

Возникла другая проблемка. Однаружил, что некоторые "нерадивые" юзеры делают запрос наподобие:
Code (any language): скопировать код в буфер обмена
index.php?id[]=3
При этом предполагается, что $id - скаляр, а не массив. Соответственно, при выполнении возникает ошибка:
Code (any language): скопировать код в буфер обмена
message: Unknown column 'DBSIMPLE_ERROR_VALUE_NOT_SCALAR' in 'where clause'
query: SELECT * FROM table WHERE id=DBSIMPLE_ERROR_VALUE_NOT_SCALAR
Есть предложение: делать автоматическое преобразование типов. Если массив - то значение преобразуется в 0. Иначе пропадает весь смысл пользования библиотекой - нужно вручную проверять типизацию.... (
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 271
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sat Apr 26, 2008 3:03 pm (спустя 1 день 15 часов 25 минут; написано за 1 минуту 38 секунд)
   Post subject:
Reply with quote

Юрик wrote:
При этом предполагается, что $id - скаляр, а не массив.
и при чем тут библиотека? Если Вы посмотрите, что попало в $_GET, то увидите там массив.
Юрик wrote:
message: Unknown column 'DBSIMPLE_ERROR_VALUE_NOT_SCALAR' in 'where clause'
Собственно, библиотека сделала именно то, для чего задумывалась: не позволила вставить в запрос данные не того типа.
Back to top
View user's profile Send private message
Юрик
Участник форума



Joined: 21 Nov 2003
Posts: 49
Карма: 3
   поощрить/наказать

Location: Питер

PostPosted: Sat Apr 26, 2008 7:29 pm (спустя 4 часа 25 минут; написано за 3 минуты 28 секунд)
   Post subject:
Reply with quote

Maus wrote:
и при чем тут библиотека? Если Вы посмотрите, что попало в $_GET, то увидите там массив.

Собственно, библиотека сделала именно то, для чего задумывалась: не позволила вставить в запрос данные не того типа.
Тогда придётся вручную проверять все переменные, которые вставляются в запрос. Чем это принципиально отличается от intval($id) или addslashes($str) в плане удобства? Почему бы не делать преобразование типов?
Back to top
View user's profile Send private message
creage
Заглянувший



Joined: 06 Mar 2008
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Sun May 04, 2008 3:31 pm (спустя 7 дней 20 часов 2 минуты; написано за 2 минуты 40 секунд)
   Post subject:
Reply with quote

Здравствуйте.

Недавно натолкнулся на проблему лишнего экранирования значений полей. В частности, при попытке запостить в базу HTML код, получаю неработающий в итоге код

в DBSimple передаю
Code (html): скопировать код в буфер обмена
<a (december.com/html/4/element/a.html) href="/data/Image/758417_20050527172209.jpg"> (december.com/html/4/element/.html)data/Image/758417_20050527172209.jpg</a>
а в базе получаю
Code (any language): скопировать код в буфер обмена
<a href="\&quot;/data/Image/758417_20050527172209.jpg\&quot;">data/Image/758417_20050527172209.jpg</a>
есть ил возможность это как-то отменить?
Back to top
View user's profile Send private message
creage
Заглянувший



Joined: 06 Mar 2008
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Tue May 06, 2008 12:50 am (спустя 1 день 9 часов 19 минут; написано за 1 минуту 15 секунд)
   Post subject:
Reply with quote

что - никто не поможет? пока решаю тем, что перед выводом в браузер, регекспами режу \&quot; - но это ведь сакс полный. не хочется отказываться от такой удобной либы DbSimple...
Back to top
View user's profile Send private message
Arcano
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue May 06, 2008 5:09 pm (спустя 16 часов 18 минут; написано за 2 минуты 3 секунды)
   Post subject: Ошибка в обработчике ошибок, при работе с двумя схемами
Reply with quote

Вот уж не знаю - ошибка в DBSimple или в моих руках..

Есть вот такой код:
Code (php): скопировать код в буфер обмена
<?php

require_once 'includes/setup.php';
require_once 'includes/DbSimple/Generic.php';

$DB = DbSimple_Generic::connect("mysql://".$AoWoWconf['mangos']['user'].":".$AoWoWconf['mangos']['pass']."@".$AoWoWconf['mangos']['host']."/".$AoWoWconf['mangos']['db']);
$DB->setErrorHandler('databaseErrorHandler');
$rDB = DbSimple_Generic::connect("mysql://".$AoWoWconf['realmd']['user'].":".$AoWoWconf['realmd']['pass']."@".$AoWoWconf['realmd']['host']."/".$AoWoWconf['realmd']['db']);


function databaseErrorHandler($message, $info)
{
        // Если использовалась @, ничего не делать.
        if (!error_reporting (www.php.net/error_reporting)()) return;
        // Выводим подробную информацию об ошибке.
        echo (www.php.net/echo) "SQL Error: $message<br><pre>";
        print_r (www.php.net/print_r)($info);
        echo (www.php.net/echo) "</pre>";
        exit (www.php.net/exit)();
}

$DB->select('Not query');
?>
Выдает такую ниформацию:
Code (html): скопировать код в буфер обмена
SQL Error:  at /mnt/lfs/aowow/aowow/test.php line 22<br> (december.com/html/4/element/br.html)<pre> (december.com/html/4/element/pre.html)Array
(
    [code] => 0
    [message] =>
    [query] => Not query
    [context] => /mnt/lfs/aowow/aowow/test.php line 22
)
</pre>
Т.е. не видно, что за ошибка... Хотя, если удалить строку $rDB = DbSimple_Generic::connect("mysql://".$AoWoWconf['realmd']['user'].":".$AoWoWconf['realmd']['pass']."@".$AoWoWconf['realmd']['host']."/".$AoWoWconf['realmd']['db']);
 то всё работает как надо:
Code (html): скопировать код в буфер обмена
SQL Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Not query' at line 1 at /mnt/lfs/aowow/aowow/test.php line 22

Array
(
    [code] => 1064
    [message] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Not query' at line 1
    [query] => Not query
    [context] => /mnt/lfs/aowow/aowow/test.php line 22
)
Соответственно, вопрос: как это обойти? Или я что-то делаю неверно?
Back to top
Arcano
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue May 06, 2008 5:32 pm (спустя 22 минуты; написано за 2 минуты 6 секунд)
   Post subject: Нашёл ошибку сам...
Reply with quote

В общем, в файле DBSimple/Mysql.php
В строке #181
Заменить
Code (php): скопировать код в буфер обмена
return $this->_setLastError(mysql_errno (www.php.net/mysql_errno)(), mysql_error (www.php.net/mysql_error)(), $query);
на:
Code (php): скопировать код в буфер обмена
return $this->_setLastError(mysql_errno (www.php.net/mysql_errno)($this->link), mysql_error (www.php.net/mysql_error)($this->link), $query);
Тогда всё работает как надо.

Вот в виде patch-файла:
Code (any language): скопировать код в буфер обмена
--- Mysql.php        (revision 53)
+++ Mysql.php        (working copy)
@@ -178,7 +178,7 @@
     
     function _setDbError($query)
     {
-        return $this->_setLastError(mysql_errno(), mysql_error(), $query);
+        return $this->_setLastError(mysql_errno($this->link), mysql_error($this->link), $query);
     }
P.S. ревизия - последний на данный момент, 241
P.P.S. большое спасибо за очень удобную библиотеку. Радует что написана русскими :)
Back to top
Maximus_Decimus
Участник форума



Joined: 14 Feb 2005
Posts: 26
Карма: 0
   поощрить/наказать

Location: Приднестровье г. Бендеры

PostPosted: Tue May 13, 2008 10:35 am (спустя 6 дней 17 часов 3 минуты; написано за 3 минуты 50 секунд)
   Post subject:
Reply with quote

Такая задача:
База данных postresql в базе хранятся рисунки в виде блобов как сформулировать запрос чтобы вытащить контент блоба т.е. рисунок чтобы его отобразить
По старинке это делаеться так
Code (php): скопировать код в буфер обмена
pg_exec (www.php.net/pg_exec)($pgconn_3, "BEGIN;");
$b_open=pg_loopen (www.php.net/pg_loopen) ($pgconn_3, $idb, "r");
$b_content=pg_loread (www.php.net/pg_loread) ($b_open, 307200);
pg_loclose (www.php.net/pg_loclose) ($b_open);
pg_exec (www.php.net/pg_exec)($pgconn_3, "COMMIT;");
Где:
$pgconn_3 конект к базе
$idb id блоба

У меня пока только одна идея лезть селектом в системную таблицу где фактически и храниться блоб

Можно это какнибудь по другому реализовать?
Back to top
View user's profile Send private message Send e-mail
Rhaps107
Заглянувший



Joined: 17 Oct 2007
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Fri May 16, 2008 2:33 pm (спустя 3 дня 3 часа 58 минут; написано за 4 минуты 16 секунд)
   Post subject:
Reply with quote

Здравствуйте.

У меня такой вопрос: не планируется ли в ближайшее время глобальная перестройка библиотеки DbSimple ?
К примеру, я написал класс-потомок DbSimple_Mysql, который переопределяет некоторые методы и работает с родительскими членами.
Если именование методов и членов изменится (не говоря уже о большем) в одной из новых версий, то мой класс не получится безболезненно обновить. А хотелось бы сохранить совместимость. Больше всего волнует метод _performQuery
Back to top
View user's profile Send private message
Rhaps107
Заглянувший



Joined: 17 Oct 2007
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Mon May 19, 2008 5:29 pm (спустя 3 дня 2 часа 55 минут; написано за 3 минуты 44 секунды)
   Post subject:
Reply with quote

Ещё хотел бы написать, что регулярное выражение по подстановке плейсхолдеров не очень хорошо реагирует на комментарии MySQL.
К примеру вот такой запрос

SELECT *
FROM table
WHERE 1 = 1 # Зачем мне это надо ?
AND ip = ?

будет обработан непредсказуемо, точнее просто неправильно - вопрос в комментарии будет воспринят как плейсхолдер, в итоге получим вместо вопроса значение, предполагаемое для поля IP, а для IP ошибку отстутствия значения. Ведь можно же пофиксить, что все, что после одинокого "#" и до символа перевода строки - нерабочая часть запроса.
Back to top
View user's profile Send private message
Умкус
Guest





Карма: 388
   поощрить/наказать


PostPosted: Wed May 21, 2008 2:38 pm (спустя 1 день 21 час 9 минут; написано за 1 минуту 18 секунд)
   Post subject:
Reply with quote

Добрый день! Пользуюсь версией 2.x.
Не получается осуществлять несколько запросов подряд типа
Code (php): скопировать код в буфер обмена
$db->query("SET @id = ?d; SELECT @id;", 123);
Адекватного объяснения ошибки базой данных не было дано (NEAR ' ON LINE 1).
Если разнести запросы перед точками с запятыми по своим $db->query(), все работает. Если делать запрос напрямую, все работает.
Это баг?
Спасибо.
Back to top
Rhaps107
Заглянувший



Joined: 17 Oct 2007
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Thu May 22, 2008 9:46 am (спустя 19 часов 7 минут; написано за 2 минуты 3 секунды)
   Post subject:
Reply with quote

Умкус, так происходит потому что DbSimple работает на основе расширения php mysql, а не какого-то своего. А ф-ция mysql_query - та, которая в конечном счете осуществляет запрос к БД, не поддерживает передачу нескольких запросов сразу. Эта возможность добавлена в расширении mysqli.
Back to top
View user's profile Send private message
Умкус
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu May 22, 2008 12:47 pm (спустя 3 часа 1 минуту; написано за 5 минут 29 секунд)
   Post subject:
Reply with quote

Спасибо за быстрый ответ. Еще встречный вопрос тогда на смежную тему. Поддерживает ли библиотека функциональность, позволяющую не повторять 10 раз одну и ту же переменную, если это необходимо, в параметрах к скрипту? В сложном запросе мне это приходится делать. Решил сэкономить время на введении переменных sql, но столкнулся с вышеизложенной проблемой. Вот теперь на развилке - либо делать 2 запроса(1 переменные, 2 запрос) либо 1 и ссылаться на существующие параметры из нескольких мест средствами библиотеки. Кажется когда=то я видел это в документации, но не могу найти.
Back to top
С.Смертин
Участник форума



Joined: 14 Oct 2007
Posts: 39
Карма: -1
   поощрить/наказать

Location: Тернополь, Украина

PostPosted: Tue Jun 17, 2008 2:10 pm (спустя 26 дней 1 час 22 минуты; написано за 2 минуты 43 секунды)
   Post subject:
Reply with quote

для многократного использования одной переменной нужно:
Code (php): скопировать код в буфер обмена
$db =& database::instance();
$rows = $db->select('SELECT * FROM tb1 WHERE tb2_id = ?1d AND id = ?1d', $id_1);

//..

'
  # Placeholder
                (\?) ([0-9]?) ( [_dsafn\#]? )            #2 #3 #4 (number of placeholder)
'


//..

   #   if (!empty($m[2]))
       if (isset (www.php.net/isset)($m[1]))
       {
           $type = $m[3];
           // префікс таблиць
           if ($type == '_')
           {
               return $this->tablePrefix;
           }
           if ($m[2] !== '')
           {
                   //дістати нумерований плейхолдер. наприклад один і той самий повторюється кілька раз...
                $pi = $m[2] - 1;
                 $value = $this->placeholders[$pi];
                 $this->placeholderIndex = $pi;
           }
           else
           {
                // Value-based placeholder.
                if (!$this->placeholders) return 'NO_VALUE';
                $value = $this->placeholders[++$this->placeholderIndex]; # array_pop($this->placeholders);
           }
библиотеку несколько переделал, потому и не буду говорить куда что вставлять...
Back to top
View user's profile Send private message Send e-mail
Ivan_
Заглянувший



Joined: 04 Jan 2008
Posts: 12
Карма: 2
   поощрить/наказать


PostPosted: Sat Jun 28, 2008 2:40 pm (спустя 11 дней 30 минут; написано за 5 минут 51 секунду)
   Post subject:
Reply with quote

Rhaps107 wrote:
Ещё хотел бы написать, что регулярное выражение по подстановке плейсхолдеров не очень хорошо реагирует на комментарии MySQL.
К примеру вот такой запрос

SELECT *
FROM table
WHERE 1 = 1 # Зачем мне это надо ?
AND ip = ?

будет обработан непредсказуемо, точнее просто неправильно - вопрос в комментарии будет воспринят как плейсхолдер, в итоге получим вместо вопроса значение, предполагаемое для поля IP, а для IP ошибку отстутствия значения. Ведь можно же пофиксить, что все, что после одинокого "#" и до символа перевода строки - нерабочая часть запроса.
Так это же чудесно. Таким образом очень легко манипулировать макроподстановками при составлении динамических конструкций.
Любую конструкцию можно пометить как
...
{ ...somecode ... #?
}
Back to top
View user's profile Send private message Send e-mail
Last_elf
Заглянувший



Joined: 09 Jul 2008
Posts: 5
Карма: 0
   поощрить/наказать


PostPosted: Wed Jul 09, 2008 12:13 pm (спустя 10 дней 21 час 32 минуты; написано за 7 минут 12 секунд)
   Post subject: Как работать с blob - объектами
Reply with quote

Доброго дня!

Есть табличка в pgSQL, в которой есть поле для блобов (тип oid). И нужно эти блобы извлекать.

Пробую делать так:
Code (php): скопировать код в буфер обмена
$row = $_db_3->selectRow('
                -- BLOB_OBJ: true
                SELECT * FROM templates WHERE id = 29
'
);
Но в $row записывается результат стандартного запроса, т.е. аттрибут "BLOB_OBJ: true" никак не влияет на результат запроса. При этом в самом объекте $_db_3 запись
Code (any language): скопировать код в буфер обмена
[attributes] => Array
        (
            [BLOB_OBJ] => true
        )
появляется.

Как же можно извлечь сам блоб объект? Может для этого служат какие-то дополнительные методы? Хотя изходя из документации, блоб должен записываться уже сразу в рез-т запроса.
Back to top
View user's profile Send private message
Maximus_Decimus
Участник форума



Joined: 14 Feb 2005
Posts: 26
Карма: 0
   поощрить/наказать

Location: Приднестровье г. Бендеры

PostPosted: Wed Jul 23, 2008 11:51 am (спустя 13 дней 23 часа 38 минут; написано за 1 минуту 59 секунд)
   Post subject:
Reply with quote

Такой вопрос реализован ли в моделе PostreSQL метод selectPage?
Возник вопрос из-за ошибки
Code (php): скопировать код в буфер обмена
$rows = $this->pgconn_3->selectPage($totalRows, "
                                        select *
                                                from goodsview gw
                                                where gw.lkcatalogid = ?
                                                order by gw.prioritet
                                                limit ?d, ?d"
, $idc, 8, 2);
Выдветься следующая ошибка
Code (php): скопировать код в буфер обмена
    [code] =>
    [message] => ERROR:  синтаксис LIMIT #,# не поддерживается
HINT:  Используйте отдельные выражения LIMIT и OFFSET.
    [query] =>
                                        select *
                                                from goodsview gw
                                                where gw.lkcatalogid = $1
                                                order by gw.prioritet
                                                limit $2, $3
Back to top
View user's profile Send private message Send e-mail
Миша Спларов
Участник форума



Joined: 17 Nov 2003
Posts: 821
Карма: 65
   поощрить/наказать

Location: Россия, Москва

PostPosted: Wed Jul 23, 2008 12:43 pm (спустя 51 минуту; написано за 16 секунд)
   Post subject:
Reply with quote

Maximus_Decimus у вас даже в ошибке написано, что нужно сделать: www.postgresql.org/docs/8.3/static/queries-limit.html
Back to top
View user's profile Send private message
Last_elf
Заглянувший



Joined: 09 Jul 2008
Posts: 5
Карма: 0
   поощрить/наказать


PostPosted: Tue Jul 29, 2008 12:57 pm (спустя 6 дней 13 минут; написано за 5 минут 28 секунд)
   Post subject:
Reply with quote

Похоже, нашел ошибку, связанную с экранированием:
Code (SQL): скопировать код в буфер обмена
[query] => INSERT INTO radio_stations ("id_rtstn", "description", "site_url") VALUES ('987', 'New York City\''s non-commercial source FOR new AND essential music')
На вход подается соответственно:
Code (SQL): скопировать код в буфер обмена
New York City\'s non-commercial source for new and essential music
Т.е. \' переходит в \''

В то время как pg_escape_string '\ переводит в ''\\ что корректно обрабатывается постгрессом

Может быть надо что-то поменять в настройках постгресса? (использую Постгресс 8.0). Имхо тупо применять pg_escape_string() для всех запросов было бы не совсем правильно. Какое ваше мнение? (+ мой предыдущий вопрос все еще актуален..)
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Aug 19, 2008 12:16 am (спустя 20 дней 11 часов 19 минут; написано за 20 секунд)
   Post subject:
Reply with quote

Last_elf
А зачем Вы на вход подаете что-то заквоченное? Передавайте просто "New York City's non-commercial source for new and essential music".
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Tue Aug 19, 2008 12:19 am (спустя 3 минуты; написано за 31 секунду)
   Post subject:
Reply with quote

Last_elf
Кстати, в постгресе по умолчанию ['] квотится именно удвоением: [''], а не заслэшиванием.
Back to top
View user's profile Send private message Send e-mail
sanek
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Sep 04, 2008 8:54 pm (спустя 16 дней 20 часов 34 минуты; написано за 3 минуты 59 секунд)
   Post subject: DBSimple забросили?
Reply with quote

Здравствуйте господа!

Пользуюсь билиотекой. Очень нравится.
Однако почему-то не выходят обновления, новые версии, не добавляются новые фичи в текущую версию.

Не означает ли все это, что библиотеку забросили и не будут дальше развивать и стоит начать присматриваться к другим разработкам?
Если работа над улучшением, расширением функционала ведется, скажите пожалуйста когда ожидать новые версии?

Спасибо!
Back to top
!Shoorf
Заглянувший



Joined: 07 Sep 2008
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Sun Sep 07, 2008 5:06 pm (спустя 2 дня 20 часов 11 минут; написано за 8 минут 4 секунды)
   Post subject:
Reply with quote

Доброго времени суток всем!

У меня вопрос про кодировки. Есть код с двумя простейшими запросами:
Code (php): скопировать код в буфер обмена
$DB = DbSimple_generic::connect("mysql://$db_user:$db_pass@$db_host/$db_name");
$categories=array (www.php.net/array)();
$catids=array (www.php.net/array)();
$rows = $DB->select('select * from `catb_categories` where `active`=\'1\' order by `order`, `name` asc;');
foreach ($rows as $numRow => $row) {
        $categories[$row[id]] = Array (www.php.net/array)('id'=> $row[id],
                        'keywords'=> $row[keywords],
                        'name'=>$row[name],
                        'template'=>$row[template]);
        $catids[]=$row[id];
        }
if (isset (www.php.net/isset)($_GET['cat'])&&in_array($_GET['cat'],$catids)) {
        $category=$_GET['cat'];
        $template=$categoties[$category][template];
}
else {
        $category=0;
        $template='default';
}
и
Code (php): скопировать код в буфер обмена
$quotes=array (www.php.net/array)();
$rows = $DB->selectPage($totalquotes, $query.' order by `id` desc limit ?d, ?d', $pageOffset, $show_limit);
if (count (www.php.net/count)($rows)==0) $rows = $DB->selectPage($totalquotes, 'select * from `catb_quotes` where `approve_date`>0 and `active`=\'1\' and `b`<\''.$b_limit.'\' limit ?d, ?d', $pageOffset, $show_limit);
foreach ($rows as $numRow => $row) {
        $quotes[] = Array (www.php.net/array)('id'=> $row[id],
                        'a_date'=> $row[a_date],
                        'type'=>$row[type],
                        'mmcontent'=>$row[mmcontent],
                        'app'=> $row[app],
                        'body'=> $row[body],
                        'rating'=> $row[rating]);
}
Проблема в том, что первый запрос, в отличие от второго почему-то всегда возвращает кирилицу в неверной кодировке, в виде "???", независимо от кодировки полей своей таблицы и порядка следования этих двух запросов (в том числе если поставить один сразу за другим). Замена
Code (php): скопировать код в буфер обмена
$DB = DbSimple_generic::connect("mysql://$db_user:$db_pass@$db_host/$db_name");
на
Code (php): скопировать код в буфер обмена
$DB = DbSimple_generic::connect("mysql://$db_user:$db_pass@$db_host/$db_name?enc=utf8");
как и добавление
Code (php): скопировать код в буфер обмена
$DB->query('set names utf8');
сразу же после установки соединения с базой ничего не меняет ВООБЩЕ. У меня Mysql5, php5, IIS6. На денвере работает так же.
Работаю с DBSimple впервые, вторые сутки уже мучаюсь с кодировками. Пожалуйста, объясните, что я не так делаю.
Back to top
View user's profile Send private message
!Shoorf
Заглянувший



Joined: 07 Sep 2008
Posts: 6
Карма: 0
   поощрить/наказать


PostPosted: Sun Sep 07, 2008 5:25 pm (спустя 19 минут; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

есть более цивилизованный способ, или обязательно делать также, но соответственно с UTF8?
mishaMC wrote:
Все таки пришлось лезть в недра драйвера (Mysql.php).

Подправил функцию function DbSimple_Mysql($dsn)
Code (php): скопировать код в буфер обмена
function DbSimple_Mysql($dsn)
    {
        $p = DbSimple_Generic::parseDSN($dsn);
        if (!is_callable (www.php.net/is_callable)('mysql_connect')) {
            return $this->_setLastError("-1", "MySQL extension is not loaded", "mysql_connect");
        }
        $ok = $this->link = @mysql_connect (www.php.net/mysql_connect)(
            $p['host'] . (empty (www.php.net/empty)($p['port'])? "" : ":".$p['port']),
            $p['user'],
            $p['pass'],
            true
        );
        $this->_resetLastError();
        if (!$ok) return $this->_setDbError('mysql_connect()');
        $ok = @mysql_select_db (www.php.net/mysql_select_db)(preg_replace (www.php.net/preg_replace)('{^/}s', '', $p['path']), $this->link);
        if (!$ok) return $this->_setDbError('mysql_select_db()');
    }
Исправил на:
Code (php): скопировать код в буфер обмена
function DbSimple_Mysql($dsn)
    {
        $p = DbSimple_Generic::parseDSN($dsn);
        if (!is_callable (www.php.net/is_callable)('mysql_connect')) {
            return $this->_setLastError("-1", "MySQL extension is not loaded", "mysql_connect");
        }
        $ok = $this->link = @mysql_connect (www.php.net/mysql_connect)(
            $p['host'] . (empty (www.php.net/empty)($p['port'])? "" : ":".$p['port']),
            $p['user'],
            $p['pass'],
            true
        );
        $this->_resetLastError();
        if (!$ok) return $this->_setDbError('mysql_connect()');
        $ok = @mysql_select_db (www.php.net/mysql_select_db)(preg_replace (www.php.net/preg_replace)('{^/}s', '', $p['path']), $this->link);
        $ok = $ok.@mysql_query (www.php.net/mysql_query)("SET NAMES 'cp1251'");
        if (!$ok) return $this->_setDbError('mysql_select_db()');
    }
Хотя, прежде чем вставлять, неплохо бы было определить версию сервера. У меня заработало. Сервер отдает данные в нужной кодировке.
Back to top
View user's profile Send private message
comm
Guest





Карма: 388
   поощрить/наказать


PostPosted: Tue Sep 16, 2008 7:13 pm (спустя 9 дней 1 час 47 минут; написано за 1 минуту 26 секунд)
   Post subject:
Reply with quote

присоединяюсь к sanek, реализация поддержки PDO в каком состоянии?
Back to top
Ivan1986
Участник форума
Warnings: 2


Joined: 09 Oct 2007
Posts: 807
Карма: 38
   поощрить/наказать


PostPosted: Tue Sep 16, 2008 11:20 pm (спустя 4 часа 7 минут; написано за 25 секунд)
   Post subject:
Reply with quote

comm
Code (php): скопировать код в буфер обмена
<?php

require_once QFWPATH.'/DbSimple/Generic.php';

/**
 * Database class for MySQL.
 */

class DbSimple_Mypdo extends DbSimple_Generic_Database
{
    private $PDO;
    private $prepareCache = array (www.php.net/array)();
   
    public function DbSimple_Mypdo($dsn)
    {
        $p = DbSimple_Generic::parseDSN($dsn);
        $base = preg_replace (www.php.net/preg_replace)('{^/}s', '', $p['path']);
        if (!class_exists (www.php.net/class_exists)('PDO')) {
            return $this->_setLastError("-1", "PDO extension is not loaded", "PDO");
        }
       
        try {
                    $this->PDO = new PDO('mysql:host='.$p['host'].';dbname='.$base, $p['user'], isset (www.php.net/isset)($p['pass'])?$p['pass']:'');
                } catch (PDOException $e) {
                        $this->_setLastError($e->getCode() , $e->getMessage(), 'new PDO');
                }
    }

    function _performGetPlaceholderIgnoreRe()
    {
        return '
            "   (?> [^"\\\\]+|\\\\"|\\\\)*    "   |
            \'  (?> [^\'\\\\]+|\\\\\'|\\\\)* \'   |
            `   (?> [^`]+ | ``)*              `   |   # backticks
            /\* .*?                          \*/      # comments
        '
;
    }
   
    function _performEscape($s, $isIdent=false)
    {
        if (!$isIdent) {
            return $this->PDO->quote($s);
        } else {
            return "`" . str_replace (www.php.net/str_replace)('`', '``', $s) . "`";
        }
    }
   
        function _performQuery($queryMain)
        {
                $this->_lastQuery = $queryMain;
                $this->_expandPlaceholders($queryMain, true);
                $p = $this->PDO->prepare($queryMain[0]);
                $p->execute(array_slice (www.php.net/array_slice)($queryMain,1));
                if ($p->errorCode()!=0)
                        return $this->_setDbError($p,$queryMain[0]);
                if (preg_match (www.php.net/preg_match)('/^\s* INSERT \s+/six', $queryMain[0]))
                        return $this->PDO->lastInsertId();
                if (!preg_match (www.php.net/preg_match)('/^\s* SELECT \s+/six', $queryMain[0]))
                        return $p->rowCount();
                //блин, тут конечно нужно еще подумать по части правильности определения
                $p->setFetchMode(PDO::FETCH_ASSOC);
                $res = $p->fetchAll();
                return $res;
/*           
           
        $result = @mysql_query($queryMain[0], $this->link);
        if ($result === false) return $this->_setDbError($queryMain[0]);
        if (!is_resource($result)) {
            if (preg_match('/^\s* INSERT \s+/six', $queryMain[0])) {
                // INSERT queries return generated ID.
                return @mysql_insert_id($this->link);
            }
            // Non-SELECT queries return number of affected rows, SELECT - resource.
            return @mysql_affected_rows($this->link);
        }
        return $result;*/

    }
   
        function _performTransformQuery(&$queryMain, $how)
        {
                // If we also need to calculate total number of found rows...
                switch ($how) {
                        // Prepare total calculation (if possible)
                        case 'CALC_TOTAL':
                                $m = null;
                                if (preg_match (www.php.net/preg_match)('/^(\s* SELECT)(.*)/six', $queryMain[0], $m)) {
                                        $queryMain[0] = $m[1] . ' SQL_CALC_FOUND_ROWS' . $m[2];
                                }
                                return true;

                        // Perform total calculation.
                        case 'GET_TOTAL':
                                // Built-in calculation available?
                                $queryMain = array (www.php.net/array)('SELECT FOUND_ROWS()');
                                // Else use manual calculation.
                                // TODO: GROUP BY ... -> COUNT(DISTINCT ...)
                                $re = '/^
                    (?> -- [^\r\n]* | \s+)*
                    (\s* SELECT \s+)                                      #1     
                    (.*?)                                                 #2
                    (\s+ FROM \s+ .*?)                                    #3
                        ((?:\s+ ORDER \s+ BY \s+ .*?)?)                   #4
                        ((?:\s+ LIMIT \s+ \S+ \s* (?:, \s* \S+ \s*)? )?)  #5
                $/six'
;
                $m = null;
                if (preg_match (www.php.net/preg_match)($re, $queryMain[0], $m)) {
                    $query[0] = $m[1] . $this->_fieldList2Count($m[2]) . " AS C" . $m[3];
                    $skipTail = substr_count (www.php.net/substr_count)($m[4] . $m[5], '?');
                    if ($skipTail) array_splice (www.php.net/array_splice)($query, -$skipTail);
                }
                return true;
        }
       
        return false;
    }
   
        function _setDbError($obj,$q)
        {
                $info=$obj->errorInfo();
                return $this->_setLastError($info[1], $info[2], $q);
        }

}

class DbSimple_Mypdo_Blob extends DbSimple_Generic_Blob
{
    // MySQL does not support separate BLOB fetching.
    var $blobdata = null;
    var $curSeek = 0;

    function DbSimple_Mypdo_Blob(&$database, $blobdata=null)
    {
        $this->blobdata = $blobdata;
        $this->curSeek = 0;
    }

    function read($len)
    {
        $p = $this->curSeek;
        $this->curSeek = min (www.php.net/min)($this->curSeek + $len, strlen (www.php.net/strlen)($this->blobdata));
        return substr (www.php.net/substr)($this->blobdata, $this->curSeek, $len);
    }

    function write($data)
    {
        $this->blobdata .= $data;
    }

    function close()
    {
        return $this->blobdata;
    }

    function length()
    {
        return strlen (www.php.net/strlen)($this->blobdata);
    }
}

?>
У меня вот в таком :)
Back to top
View user's profile Send private message Send e-mail
comm
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Sep 19, 2008 1:04 pm (спустя 2 дня 13 часов 43 минуты; написано за 9 минут 57 секунд)
   Post subject:
Reply with quote

хм...я имел в виду нечто другое....
Даннй класс будет работать с MySQL и только :(
Для Firebird придется писать новый классс, хотя все методы определяющие контекст( функции работающие с диалектом SQL - обработка пласеходеров..commit...) уже определены в классе DbSymple_Firebird (лучше бы было вынести подобные функцции в отдельный класс)
Наилучшем представляется работа с драйвером бд, PDO, ODBC... в контексте определенного диалекта

к примеру можно работать ч-з ODBC c базой MS SQLServer в контексте MySQL или другом
Back to top
Guest






Карма: 388
   поощрить/наказать


PostPosted: Fri Sep 19, 2008 3:19 pm (спустя 2 часа 14 минут; написано за 1 минуту 30 секунд)
   Post subject:
Reply with quote

Для чего нужны классы DbSimple_Mypdo, DbSimple_Myodbc,... DbSimple_MyXXX ?
Back to top
comm
Guest





Карма: 388
   поощрить/наказать


PostPosted: Fri Sep 19, 2008 3:20 pm (спустя 1 минуту 16 секунд; написано за 16 секунд)
   Post subject:
Reply with quote

ЗЫ: Гость это опять я
Back to top
Ivan1986
Участник форума
Warnings: 2


Joined: 09 Oct 2007
Posts: 807
Карма: 38
   поощрить/наказать


PostPosted: Sat Sep 20, 2008 5:54 pm (спустя 1 день 2 часа 33 минуты; написано за 1 минуту 23 секунды)
   Post subject:
Reply with quote

comm
Пилите, Шура, пилите
Заметте, что тут mysql зависимый код только в конструкторе, помоему тут хорошим вариантом будет все независимое от типа БД вынести в PDO, а зависимое или наследовать от него или же передавать дип базы как параметр.
Back to top
View user's profile Send private message Send e-mail
comm
Guest





Карма: 388
   поощрить/наказать


PostPosted: Mon Sep 22, 2008 4:54 pm (спустя 1 день 22 часа 59 минут; написано за 11 минут 13 секунд)
   Post subject:
Reply with quote

Ivan1986
Вынести в пдо, это типо переписать пдо о_О?!

ПДО это только один из вариантов функцонирования. Я говорю о необходимости серьезного вмешательства в архитектуру бибдиотеки. Необходимо разделить класс DbSimple_Mysql и ему подобные на класс драйвера БД (функции connect и fetch...) и класс диалекта БД(функции _performEscape, _performGetPlaceholderIgnoreRe...)
Тогда можно будет использовать обин драйвер, для нескольких диалектов и наоборот.
К примегу для работы с Mysql может быть использованна следующая строка:
mysql://Логин:Пароль@Хост/База - диалект mysql по умолчанию(для совместимости), что равносильно:
mysql[mysql]://Логин:Пароль@Хост/База.
odbc[mysql]://Логин:Пароль@Хост/База - подключение подключение базы ч.з odbc c диалектом mysql.
pdo[mysql]://Логин:Пароль@Хост/База - тоже самое, через PDO.
Back to top
Ivan1986
Участник форума
Warnings: 2


Joined: 09 Oct 2007
Posts: 807
Карма: 38
   поощрить/наказать


PostPosted: Mon Sep 22, 2008 9:40 pm (спустя 4 часа 46 минут; написано за 2 минуты 36 секунд)
   Post subject:
Reply with quote

comm
Зачем так извращаться?
С диалектами у нас справляется само PDO - PDO->quote() зависимый
Пока на mysql завязан только конструктор
Вынести в общий класс DbSimple_PDO все остальные функции, от него наследовать классы DbSimple_Mypdo, DbSimple_Pgpdo, DbSimple_Fbpdo и так далее, в которых обьявить только конструктор с инициализацией
Наследуйте класс базы от класса диалекта и все.
Back to top
View user's profile Send private message Send e-mail
comm
Guest





Карма: 388
   поощрить/наказать


PostPosted: Thu Sep 25, 2008 11:04 pm (спустя 3 дня 1 час 24 минуты; написано за 51 секунду)
   Post subject:
Reply with quote

Ivan1986
pdo - только один из вариантов расширения библиотеки!!! Почитайте внимательнее!
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page Previous  1, 2, 3 ... 7, 8, 9 ... 13, 14, 15  Next
Page 8 of 15    Email to a Friend.
Post a reply
Username
Subject
Господа спамеры и оптимизаторы!

Вы можете даже и не пытаться вставлять в текст поста ссылки - они все равно автоматически удаляются (вернее, тэги <a> заменяются на тэги <u>).

Но если не поверите и все же попытаетесь - как только увидите, что все безрезультатно, удалите свой пост, пожалуйста. Модераторы тоже люди, нехорошо, если они погрязнут в тоннах спама.
     

Disable BBCode in this post
Disable Smilies in this post
    HTML is OFF
BBCode is ON
Smilies are ON
You cannot post new topics in this forum. You can reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML